package config

import (
	"ai-gateway/common"
	"fmt"
	"os"
	"strconv"
	"strings"
	"sync"

	"github.com/joho/godotenv"
)

// Config 全局配置对象
var Config = struct {
	// 服务IP
	ServiceIP string

	// 数据库
	DBHost     string
	DBPort     string
	DBUser     string
	DBPassword string
	DBName     string

	// 服务端口
	BusinessServicePort int
	AdapterServicePort  int
	RouteServicePort    int
	AuthServicePort     int
	MonitorServicePort  int
	TrafficServicePort  int

	// AI流式场景
	StreamScenarios map[string]bool
}{}

// 保证初始化只执行一次
var once sync.Once

// init 包加载时自动执行，且全局只执行一次
func init() {
	fmt.Println("hello")
	once.Do(func() {
		// 加载配置的逻辑（只执行一次）
		if err := godotenv.Load("../.env"); err != nil {
			common.Logger.Warn().Err(err).Msg("未找到.env文件，将使用默认配置")
		}

		// 数据库配置
		Config.DBHost = getEnv("DB_HOST", "127.0.0.1")
		Config.DBPort = getEnv("DB_PORT", "3306")
		Config.DBUser = getEnv("DB_USER", "root")
		Config.DBPassword = getEnv("DB_PASSWORD", "")
		Config.DBName = getEnv("DB_NAME", "ai_gateway")

		// 服务端口
		Config.BusinessServicePort = getEnvAsInt("BUSINESS_SERVICE_PORT", 8080)
		Config.AdapterServicePort = getEnvAsInt("ADAPTER_SERVICE_PORT", 8081)
		Config.RouteServicePort = getEnvAsInt("ROUTE_SERVICE_PORT", 8082)
		Config.AuthServicePort = getEnvAsInt("AUTH_SERVICE_PORT", 8084)
		Config.MonitorServicePort = getEnvAsInt("MONITOR_SERVICE_PORT", 8085)
		Config.TrafficServicePort = getEnvAsInt("TRAFFIC_SERVICE_PORT", 8086)

		// 服务IP
		Config.ServiceIP = getEnv("SERVICE_IP", "localhost")

		// 流式场景
		streamScenariosStr := getEnv("STREAM_SCENARIOS", "")
		Config.StreamScenarios = make(map[string]bool)
		for _, s := range strings.Split(streamScenariosStr, ",") {
			if s = strings.TrimSpace(s); s != "" {
				Config.StreamScenarios[s] = true
			}
		}
		common.Logger.Info().Msg("配置初始化完成")
	})
}

// getEnv 读取环境变量（带默认值）
func getEnv(key, defaultValue string) string {
	if val := os.Getenv(key); val != "" {
		return val
	}
	return defaultValue
}

// getEnvAsInt 读取环境变量并转为int（带默认值）
func getEnvAsInt(key string, defaultValue int) int {
	valStr := os.Getenv(key)
	if valStr == "" {
		return defaultValue
	}
	val, err := strconv.Atoi(valStr)
	if err != nil {
		common.Logger.Warn().Err(err).Msg("不是有效整数，使用默认值")
		return defaultValue
	}
	return val
}
